/*
 * DSMManager.h
 *
 *  Created on: Dec 15, 2013
 *      Author: m
 */

#ifndef DSMMANAGER_H_
#define DSMMANAGER_H_

#include <cstring>
#include "DSMComun.h"
#include "MessageQueue.h"
#include "Sequence.h"
#include "CPrinter.h"

using ipc::CPrinter;
using ipc::MessageQueue;
using ipc::Sequence;

class DSMManager
{
protected:
    static std::string s_nombreAgente;
    static MessageQueue<PedidoDSM> s_colaPedidos;
    static MessageQueue<TokenDSM>  s_colaEntrega;
    static MessageQueue<TokenDSM>  s_colaLiberacion;

    DSMManager()
    {
    }

    ~DSMManager()
    {
    }

public:

    static void inicializar( std::string nombreAgente )
    {
        s_nombreAgente = nombreAgente;

        MessageQueue<PedidoCreacionCanalDSM> colaPedidoCreacion =
                MessageQueue<PedidoCreacionCanalDSM>::get( DSM_IPC_BASEFILE, COLA_REQUEST_CREACION );

        MessageQueue<PedidoCreacionCanalDSM> colaRespuestaCreacion =
                MessageQueue<PedidoCreacionCanalDSM>::get( DSM_IPC_BASEFILE, COLA_REPLY_CREACION );

        Sequence seqIdCreacion =
                Sequence::get( DSM_IPC_BASEFILE, SEQ_DSM_ID_CANAL );

        PedidoCreacionCanalDSM pedido;

        pedido.id = seqIdCreacion.getNext();
        strcpy( pedido.nombre, s_nombreAgente.c_str() );

        colaPedidoCreacion.put( pedido.id, pedido );

        colaRespuestaCreacion.get( pedido.id );

        s_colaPedidos = MessageQueue<PedidoDSM>::get( s_nombreAgente   + "shm.ipc", COLA_PEDIDO_HOST  );
        s_colaEntrega = MessageQueue<TokenDSM>::get ( s_nombreAgente   + "shm.ipc", COLA_ENTREGA_HOST );
        s_colaLiberacion = MessageQueue<TokenDSM>::get( s_nombreAgente + "shm.ipc", COLA_LIBERAR_HOST );
    }


    static void pedir( int shmid )
    {
        PedidoDSM pedido;
        TokenDSM entrega;

        pedido.idDSM = shmid;

        // mete el pedido en la cola del Requestor de este agente
        s_colaPedidos.put( 1, pedido );

        // espera el token por la cola de entrega del Requestor de este agente
        entrega = s_colaEntrega.get( shmid );
    }

    static void liberar( int shmid )
    {
        TokenDSM liberar;
        liberar.idDSM = shmid;

        // mete el token en la cola del Releaser de este agente
        s_colaLiberacion.put( 1, liberar );
    }
};

#endif /* DSMMANAGER_H_ */
